#include "mywidget.h"
#include "ui_mywidget.h"
#include <QThread>
#include <QtDebug>

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::myWidget)
{
    ui->setupUi(this);
    //动态分配空间，不能指定父对象
    myT = new myThread;

    //创建子线程
    thread = new QThread(this);

    //把自定义线程加入到子线程，关联
    myT->moveToThread(thread);

    connect(myT, &myThread::mySignal, this, &myWidget::dealSignal);
    qDebug() << "MainThreadId is" << QThread ::currentThreadId();

    connect(this, &myWidget::startThread, myT, &myThread::myTimeout);

    connect(this, &myWidget::destroyed, this, &myWidget::dealClose);
    //线程处理函数内部不允许处理图形界面

    //connect() 第5个参数的作用，连接方式：默认、直接、队列
    //多线程才有意义
    //默认的时候
    //如果是多线程，默认队列；如果是单线程，默认直接方式
    //队列方式：槽函数所在的线程和接收者一样
    //直接方式：槽函数所在的线程和发送者一样
}

myWidget::~myWidget()
{
    delete ui;
}

void myWidget::dealSignal()
{
    static int i = 0;
    i++;
    ui->lcdNumber->display(i);
}


void myWidget::on_pBtnStart_clicked()
{
    //isRunning()判断线程是否在运行 如果事件循环正在进程，返回 true；否则返回 false。事件循环定义为调用 exec() 到退出 exit() 所执行的代码段。
    if(thread->isRunning() == true)
    {
        return;
    }
    //启动线程，但是没有启动线程处理函数
    thread->start();
    myT->setFlag(false);

    //不能直接调用线程处理函数
    //直接调用线程处理函数，会导致线程处理函数和主线程是同一个线程
    //myT->myTimeout();

    //只能通过信号槽方式调用
    emit startThread();

}
//关闭窗口处理
void myWidget::dealClose()
{

    myWidget::on_pBtnStop_clicked();

}


void myWidget::on_pBtnStop_clicked()
{

    if(thread->isRunning() == false)//如果已经关闭则没有再按了
    {
        return;
    }
    myT->setFlag(true);
    //退出子线程
    thread->quit();
    thread->wait();
    //回收资源
    delete  myT;  //关闭窗口前释放自定义线程，否则内存泄露；

}

